package com.mipo.designpattern.proxypattern.dynamicproxy.jdk.sample.daoproxy;
/**
 	测试类
	动态代理有以下特点:
	1.代理对象,不需要实现接口
	2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
	3.动态代理也叫做:JDK代理,接口代理
	JDK中生成代理对象的API
	代理类所在包:java.lang.reflect.Proxy
	JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
	static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
	注意该方法是在Proxy类中是静态方法,且接收的三个参数依次为:
	•ClassLoader loader,:指定当前目标对象使用类加载器,获取加载器的方法是固定的
	•Class<?>[] interfaces,:目标对象实现的接口的类型,使用泛型方式确认类型
	•InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
	代码示例:
	接口类UserDao.java以及接口实现类,目标对象UserDaoImpl是一样的,没有做修改.在这个基础上,增加一个代理工厂类(ProxyFactory.java),将代理类写在这个地方,
	然后在测试类(需要使用到代理的代码)中先建立目标对象和代理对象的联系,然后代用代理对象的中同名方法
	总结:
	代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理
	
	还有一个有趣的作用是可以用作远程调用，比如现在有Java接口，这个接口的实现部署在其它服务器上，在编写客户端代码的时候，没办法直接调用接口方法，
	因为接口是不能直接生成对象的，这个时候就可以考虑代理模式（动态代理）了，通过Proxy.newProxyInstance代理一个该接口对应的InvocationHandler对象，
	然后在InvocationHandler的invoke方法内封装通讯细节就可以了。具体的应用，最经典的当然是Java标准库的RMI，
	其它比如hessian，各种webservice框架中的远程调用，大致都是这么实现的。

 */
public class AaMain {
	
    public static void main(String[] args) {
        // 目标对象
        UserDao target = new UserDaoImpl();
        // 给目标对象，创建代理对象
        UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
        // 执行方法【代理对象】
        proxy.save();
    }
    
}

